package com.company

import java.io.File

fun main() {

    //1、list创建与元素获取
    //getOrElse是一个安全索引取值函数，需要2个参数。第一个是索引值，第二个是提供默认值的lambda
    //getOrNull是另一个安全索引取值函数，返回null而不是抛出异常
    val list = listOf<String>("jack", "rose", "bangde")
//    list[3]// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    println(list.getOrElse(4) { "Unknown" })
    println(list.getOrNull(4))
    println(list.getOrNull(4) ?: "Unknown")


    //2、可变列表:支持内容修改的列表  可以使用mutableListOf()
    //toList和toMutableList实现只读列表和可变列表相互转换
    val mutableList = mutableListOf<String>("jack", "rose", "bangde")
    mutableList.add("jimmy")
    mutableList.remove("rose")
    println(mutableList)

    println(mutableList.toList())
    println(list.toMutableList())

    //3、mutator函数:能修改可变列表的函数    添加和删除元素运算符  基于lambda指定的条件删除元素
    val mutablelist2 = mutableListOf<String>("jack", "jacky", "bangde")
    mutablelist2 += "jimmy"
    println(mutablelist2)
    mutablelist2 -= "jason"
    println(mutablelist2)
    mutablelist2.removeIf { it.contains("jack") }
    println(mutablelist2)


    //4、遍历
    val list2 = listOf<String>("jack", "jacky", "bangde")
    //for in 遍历
    for (s in list2) {
        println(s)
    }
    //forEach遍历
    list2.forEach { println(it) }
    //forEachIndexed遍历
    list2.forEachIndexed { index, item -> println("$index,$item") }

    //5、解构：通过_符号过滤不想要的元素
    val (origin, _, proxy) = list2
    println("$origin  $proxy")


    //6、set集合 不可重复  通过setOf创建set集合，使用elementAt函数读取
    val set = setOf("jack", "jacky", "bangde", "jack")
//    set[5] //没有这种写法
    println(set.elementAt(0))
    println(set.elementAt(1))
    println(set.elementAt(2))
//    println(set.elementAt(3)) //Exception in thread "main" java.lang.IndexOutOfBoundsException: Collection doesn't contain element at index 3.

    //7、可变集合通过mutableSetOf创建
    val mutableSetOf = mutableSetOf("jack", "jacky", "bangde")
    mutableSetOf += "groovy"
    mutableSetOf.forEach { println(it) }


    //8、集合转换    把list转换成set 去掉重复元素
    val list3 = listOf("jack", "jacky", "bangde", "jack")
            .toSet()
            .toList()
    println(list3)

    //使用快捷函数  distinct()去重
    println(listOf("jack", "jacky", "bangde", "jack").distinct())


    //9、数组类型
    val intArray = intArrayOf(10, 30, 40)
    listOf(10, 30, 40).toIntArray()

    val array = arrayOf(File("xxx"), File("yyy"))


    //10、Map集合
    val map = mapOf("jack" to 10, "rose" to 30, "jack" to 20)
    println(map)

    //to不是关键字 是个省略了点号和参数的特殊函数  将键和值转化成一对Pair
    mapOf(Pair("jack", 20), Pair("rose", 30), Pair("jack", 20))

    //11、读取Map的值
    //[]取值运算符，如果键不存在返回null
    println(map["jack"])
    //getValue,如果不存在就抛出异常
    println(map.getValue("jack"))
    //getOrElse,使用匿名函数返回默认值
    println(map.getOrElse("lisi") { "unknown" })
    //getOrDefault,如果没有返回默认值
    println(map.getOrDefault("lisi", 0))


    //12、map遍历
    map.forEach {
        println("${it.key},${it.value}")
    }

    map.forEach { (key, value) -> println("${key},${value}") }


    //13、可变map
    val mutableMap = mutableMapOf("jack" to 10, "rose" to 30, "jack" to 20)
    mutableMap += "jimmy" to 40
    mutableMap.put("jimmy", 41)

    println(mutableMap.getOrPut("jimmy2") { 18 })
    mutableMap.getOrPut("lisi") { 18 }
    println(mutableMap)
}